﻿#include <iostream>
#include <fstream>
#include <string>
#include <codecvt>
#include "include/hpdf.h"
#pragma comment(lib, "hpdf.lib")

void create_pdf(const std::string& font_file_path, const std::string& output_file,
    float font_size, float x_start, float y_start, float line_height, float char_width) {

    HPDF_Doc pdf = HPDF_New(NULL, NULL);  // 创建文件对象
    if (!pdf) {
        std::cerr << "Failed to create PDF object!" << std::endl;
        return;
    }

    HPDF_UseUTFEncodings(pdf);
    HPDF_SetCurrentEncoder(pdf, "UTF-8"); // 设置编码

    const char* font_name = HPDF_LoadTTFontFromFile(pdf, font_file_path.c_str(), 1); // 加载字体
    if (!font_name) {
        std::cerr << "Failed to load font!" << std::endl;
        HPDF_Free(pdf);
        return;
    }

    std::cout << "Using font: " << font_name << std::endl; // 输出显示使用的字体

    HPDF_Font font = HPDF_GetFont(pdf, font_name, "UTF-8"); // 获取字体句柄
    HPDF_Page page = HPDF_AddPage(pdf);    // 添加页面
    HPDF_Page_SetFontAndSize(page, font, font_size);    // 设置页面字体和大小

    float x = x_start;
    float y = y_start;
    int char_count = 0;

    HPDF_Page_BeginText(page);

    // 转换器：将 char32_t 转为 UTF-8
    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> converter;

    for (int i = 0x4E00; i <= 0x9FA5; ++i) {
        char32_t ch = static_cast<char32_t>(i);
        std::string utf8str = converter.to_bytes(ch);  // 转换为 UTF-8 字符串

        // 每行15个字符
        if (char_count % 15 == 0 && char_count != 0) {
            x = x_start;
            y -= line_height; // 换行
        }

        // 每页300个字符
        if (char_count % 300 == 0 && char_count != 0) {
            HPDF_Page_EndText(page);
            page = HPDF_AddPage(pdf);  // 新建一页
            HPDF_Page_BeginText(page);
            HPDF_Page_SetFontAndSize(page, font, font_size);
            y = y_start;  // 重置起始 y 坐标
        }

        // 输出字符
        HPDF_Page_TextOut(page, x, y, utf8str.c_str());
        x += char_width;  // 字符之间的间距

        char_count++;
    }

    HPDF_Page_EndText(page);
    HPDF_SaveToFile(pdf, output_file.c_str()); // 保存文件
    HPDF_Free(pdf);
}

int main() {
    std::string font_path = "simsun.ttf";  // 字体路径
    std::string output_path = "output.pdf";  // 输出文件路径
    float font_size = 30.0f;  // 字体大小
    float x_start = 30.0f;  // 起始 x 坐标
    float y_start = 800.0f;  // 起始 y 坐标
    float line_height = 40.0f;  // 行高
    float char_width = 35.0f;  // 字符宽度

    // 调用函数生成 PDF
    create_pdf(font_path, output_path, font_size, x_start, y_start, line_height, char_width);

    return 0;
}
